package cc.wanforme.text2class.handler;

import cc.wanforme.text2class.entity.AnalysisConfig;
import cc.wanforme.text2class.entity.BeanField;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 源数据解析成 BeanClass 和 BeanField
 */
public class TextDataAnalysis extends BaseDataAnalysis {

    /** 使用空格拆分元素
     * @param str 行数据
     * */
    @Override
    public List<String> cutElements(String str, AnalysisConfig config) {
        String [] items = str.trim().split(" ");
        boolean mergeWhiteSpace = config.isMergeWhiteSpace();
        List<String> arr = Arrays.stream(items).filter(s -> {
            if (mergeWhiteSpace) {
                return !s.trim().isEmpty();
            }
            return true;
        }).collect(Collectors.toList());
        return arr;
    }

    /** 获取属性名称。无效数据返回 null */
    @Override
    public String getName(String rawLine, List<String> items, AnalysisConfig config) {
        return items.size() > 1 ? items.get(0) : null;
    }

    /** 获取属性类型。无效数据返回 null */
    @Override
    public String getType(String rawLine, List<String> items, AnalysisConfig config) {
        if (items.size() < 2) {
            return null;
        }

        String type =  items.get(1);
        return type;
    }

    /** 获取属性类型 */
    @Override
    public String getDesc(String rawLine, List<String> items, AnalysisConfig config) {
        return  items.size() > 2 ? items.get(2) : null;
    }

    /** 解析结果是否有效，根据这个结果设置最后的 valid */
    @Override
    protected boolean isValid(BeanField beanField, AnalysisConfig config) {
        return BaseDataAnalysis.isBlank(beanField.getName()) && BaseDataAnalysis.isBlank(beanField.getType());
    }

    /** 前置处理 */
    @Override
    public String beforeAnalysis(String rawLine, AnalysisConfig config) {
        return rawLine;
    }

    /** 后置处理 */
    @Override
    public void afterAnalysis(BeanField beanField, List<String> items, AnalysisConfig config) {
        // 未处理部分
        String rawLine = beanField.getRawLine();
        if (rawLine.length()>2) {
            List<String> unArrs = items.subList(2, items.size());
            beanField.setUnResolve(String.join("", unArrs));
        }

    }


}
